import axios from 'axios'
import type { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios'

// 创建 axios 实例
const request: AxiosInstance = axios.create({
  // baseURL 通过 Vite 代理处理，不需要指定完整 URL
  withCredentials: true, // 携带 Cookie（若后端基于会话鉴权，必须开启）
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json',
  },
})

// 请求拦截器
request.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 开发环境打印 GET 请求参数，便于排查分页/筛选入参是否符合后端预期
    if (import.meta && import.meta.env && import.meta.env.DEV && config.method?.toUpperCase() === 'GET') {
      // eslint-disable-next-line no-console
      console.debug('[HTTP][GET]', config.url, config.params)
    }
    // 从 localStorage 获取 token
    const token = localStorage.getItem('token')
    if (token && config.headers) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse) => {
    const { data } = response

    // 兼容多种返回结构：
    // 1) { code, data, message }
    if (data && typeof data === 'object' && 'code' in data) {
      if (data.code === 0) return data.data
      const msg = data.message || '请求失败'
      console.error('API Error:', msg)
      return Promise.reject(new Error(msg))
    }

    // 2) { success, data }
    if (data && typeof data === 'object' && 'success' in data) {
      // @ts-ignore
      if (data.success) return (data.data ?? data)
      const msg = (data.message || '请求失败') as string
      console.error('API Error:', msg)
      return Promise.reject(new Error(msg))
    }

    // 3) 分页直接返回 { records, total, ... }
    if (data && typeof data === 'object' && ('records' in data || 'total' in data)) {
      return data
    }

    // 4) 其他情况，直接返回 data
    return data
  },
  (error) => {
    // HTTP 错误
    console.error('Request Error:', error)
    
    if (error.response?.status === 401) {
      // 未授权，清除 token 并跳转到登录页
      localStorage.removeItem('token')
      localStorage.removeItem('userInfo')
      // 这里可以添加路由跳转到登录页
    }
    
    return Promise.reject(error)
  }
)

export default request
